package com.ruoyi.jihuo.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.ruoyi.jihuo.domain.Categories;
import com.ruoyi.jihuo.mapper.CategoriesMapper;
import com.ruoyi.jihuo.service.CallbackService;
import com.ruoyi.jihuo.service.CategoriesService;
import com.taobao.api.ApiException;
import com.taobao.api.DefaultTaobaoClient;
import com.taobao.api.TaobaoClient;
import com.taobao.api.request.ItemcatsGetRequest;
import com.taobao.api.response.ItemcatsGetResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author：LXY
 * @DATE：2025-09-15 16:02
 * @Description：回调请求处理器
 */
@Slf4j
@RestController
public class JhTmCallback {
    @Autowired
    private CallbackService callbackService;
    @Autowired
    private CategoriesService categoriesService;
    /**
     * 处理淘宝授权授权信息回调
     * @return 响应信息
     */
    @GetMapping("/authCallback/{feature}")
    public void authCallback(
            @RequestParam(value = "code", required = true) String authCode,
            @PathVariable("feature") String feature){
        log.info("接收到淘宝回调请求,接收到的code值为:{},特征:{}", authCode, feature);
        callbackService.processingAuthCallback(authCode,feature);
    }
    @GetMapping("test")
    public List<Categories> test() {
        List<Categories> allCategories = new ArrayList<>();
        // 使用Map缓存已查询的类目（CID -> Categories对象）
        Map<Long, Categories> categoryCache = new HashMap<>();

        // 从根类目开始处理
        processCategory(0L, allCategories, categoryCache, 0, 1);
        categoriesService.saveBatch(allCategories);
        return allCategories;
    }

    private void processCategory(Long parentCid,
                                 List<Categories> resultList,
                                 Map<Long, Categories> categoryCache,
                                 int currentLevel,
                                 int maxLevel) {
        try {
            ArrayList<String> noCids = new ArrayList<>();
            noCids.add("121266001");
            noCids.add("120886001");
            noCids.add("98");
            noCids.add("120950002");
            noCids.add("50802001");
            noCids.add("50026555");
            noCids.add("50008075");
            noCids.add("50019095");
            noCids.add("50014927");
            noCids.add("50025707");
            noCids.add("30");
            noCids.add("1801");
            noCids.add("50023282");
            noCids.add("1512");
            noCids.add("1201");
            noCids.add("1101");
            noCids.add("50019780");
            noCids.add("50002768");
            noCids.add("124912001");
            noCids.add("50011949");
            noCids.add("50022517");
            noCids.add("50008165");
            noCids.add("50020275");
            noCids.add("121380001");
            noCids.add("121536007");
            noCids.add("50008907");
            noCids.add("99");
            noCids.add("23");
            noCids.add("50004958");
            noCids.add("33");
            noCids.add("50023575");
            noCids.add("50025968");
            noCids.add("122966004");
            noCids.add("123536002");
            noCids.add("123690003");
            noCids.add("123500005");
            noCids.add("124868003");
            noCids.add("125406001");
            noCids.add("125102006");
            noCids.add("126252002");
            noCids.add("126488005");
            noCids.add("126602002");
            noCids.add("126488008");
            noCids.add("127076003");
            noCids.add("127878006");
            noCids.add("127882008");
            noCids.add("127588002");
            noCids.add("201136401");
            noCids.add("201149009");
            noCids.add("201160314");
            noCids.add("201236409");
            noCids.add("201273575");
            noCids.add("201230407");
            noCids.add("127110013");
            noCids.add("201402901");
            noCids.add("201412401");
            noCids.add("201516601");
            noCids.add("201514001");
            noCids.add("201810301");
            noCids.add("202056613");
            noCids.add("202162401");
            // 1. 调用API获取类目数据
            JsonNode response = getSc(parentCid);
            JsonNode itemCats = response
                    .get("itemcats_get_response")
                    .get("item_cats");

            if (itemCats == null || itemCats.isEmpty()) return;

            // 2. 遍历处理当前层级类目
            for (JsonNode node : itemCats.get("item_cat")) {
                String cid = node.get("cid").asText();
                if (noCids.contains(cid)) {
                    continue;
                }
                Categories category = createCategory(node);
                resultList.add(category);
                categoryCache.put(Long.valueOf(category.getCid()), category);

                // 3. 递归处理子类目（仅当is_parent=true时继续）
                if (currentLevel < maxLevel && node.get("is_parent").asBoolean()) {
                    processCategory(Long.valueOf(category.getCid()),
                            resultList,
                            categoryCache,
                            currentLevel + 1,
                            maxLevel);
                }
            }
        } catch (Exception e) {
            // 记录错误并继续处理其他类目
            log.error("处理类目ID {} 时出错: {}", parentCid, e.getMessage());
        }
    }

    private Categories createCategory(JsonNode node) {
        Categories category = new Categories();
        category.setCid(node.get("cid").asText());
        category.setName(node.get("name").asText());
        category.setParentId(node.get("parent_cid").asLong());
        category.setUseTemplateCategory("TE_FI_CA");
        // 可扩展其他字段
        return category;
    }

    private static JsonNode getSc(Long parentCid) throws ApiException, JsonProcessingException {
        String url = "http://gw.api.taobao.com/router/rest";
        String appkey = "35070019";
        String secret = "ad4719fd51eeec1d35ac3d0ad7787d84";
        String sessionKey = "6101c2625b7ea1b417b0acb389756fbdc71c0b9c813a5082219531158175";
        TaobaoClient client = new DefaultTaobaoClient(url, appkey, secret);
        ItemcatsGetRequest req = new ItemcatsGetRequest();
        req.setFields("cid,parent_cid,name,is_parent");
        req.setParentCid(parentCid);
        ItemcatsGetResponse rsp = client.execute(req, sessionKey);
        JsonMapper mapper = new JsonMapper();
        JsonNode jsonNode = mapper.readTree(rsp.getBody());
        return jsonNode;
    }
}
